package bean;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import bean.vo.ItemCotizacionVO;

@Entity 
@Table( name = "items_cotizacion" )
public class ItemCotizacion extends EntidadPersistente{
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Producto producto;
	private int cantidadCotizada;
	private Float precio;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private DescuentoPorCantidad descuento;
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Proveedor proveedor;
	@ManyToOne
	private Cotizacion cotizacion;
	
	public ItemCotizacion () {}
	
	public ItemCotizacion (Cotizacion cotizacion, Producto producto){
		this.cotizacion = cotizacion;
		this.producto = producto;
	}
	
	public ItemCotizacion (Cotizacion cotizacion, Producto producto, int cantidadCotizada, float precio, 
			DescuentoPorCantidad descuento, Proveedor proveedor){
		this.cotizacion = cotizacion;
		this.producto = producto;
		this.cantidadCotizada = cantidadCotizada;
		this.precio = precio;
		this.descuento = descuento;
		this.proveedor = proveedor;
	}
	
	public ItemCotizacionVO getVO() {
		ItemCotizacionVO vo = new ItemCotizacionVO();
		vo.setCantidadCotizada(cantidadCotizada);
		vo.setDescuento(descuento != null ? descuento.getVO() : null);
		vo.setPrecio(precio);
		vo.setProducto(producto != null? producto.getVO() : null);
		
		return vo;
	}
	
	public Producto getProducto() {
		return producto;
	}
	
	public void setProducto(Producto producto) {
		this.producto = producto;
	}
	
	public int getCantidadCotizada() {
		return cantidadCotizada;
	}
	
	public void setCantidadCotizada(int cantidadCotizada) {
		this.cantidadCotizada = cantidadCotizada;
	}
	
	public Float getPrecio() {
		return precio;
	}
	
	public void setPrecio(Float precio) {
		this.precio = precio;
	}
	
	public DescuentoPorCantidad getDescuento() {
		return descuento;
	}
	
	public void setDescuento(DescuentoPorCantidad descuento) {
		this.descuento = descuento;
	}
	
	public Proveedor getProveedor() {
		return proveedor;
	}
	
	public void setProveedor(Proveedor proveedor) {
		this.proveedor = proveedor;
	}

	public Cotizacion getCotizacion() {
		return cotizacion;
	}

	public void setCotizacion(Cotizacion cotizacion) {
		this.cotizacion = cotizacion;
	}
	
	@Override
	public int hashCode() {
		final int primo = 31;
		int result = 1;
		result = primo * (result + (producto == null ? 0 : producto.hashCode()) + (cotizacion == null ? 0 : cotizacion.hashCode()));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;	
		if ((obj == null) || (!(obj instanceof ItemCotizacion))) {
			return false;
		}
		
		ItemCotizacion otro = (ItemCotizacion) obj;
		
		boolean mismoProducto = (producto!=null && otro.producto != null ? (producto.equals(otro.producto)) : false);
		boolean mismaCotizacion = (cotizacion!=null && otro.cotizacion != null ? (cotizacion.equals(otro.cotizacion)) : false);
		
		return mismoProducto && mismaCotizacion;
	}
}
